
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>浅拷贝</title>
</head>
<body>
    

    <script>
        // js中有赋值 = 一：值传递   二：地址传递
        //  一：值传递   基本数据类型 赋值  number string boolean undefined null  Symbol bigInt

        // let  a = 100;
        // b =a; 
        // b=200
        // console.log(a+":"+b);


        // let  a = true;
        // b =a; 
        // b=false
        // console.log(a+":"+b);


        //  二：地址传递  object  array  指针 内存首地址
        // let obj1 = {name:"tom"}
        // obj2 = obj1
        // obj2.name = "jack"
        // console.log(obj1);
        // console.log(obj2);


        // let  arr1 = [1,2,3]
        // arr2 = arr1
        // arr2[0] = 10

        // console.log(arr1);//10 2 3
        // console.log(arr2);//10 2 3
        
        // 存在问题： 复杂数据类型-地址传递   一改全改  如果要把一个对象里的所有属性值给另外一个对象？ 怎么做？

        // let  obj1 = { money: 1000000000,car: "玛莎拉蒂"}  ; 
        // let  obj2 = { };
        // 这不是我们的需求
        // obj2 = obj1  //指向同一内存首地址  
        // obj1.money = 1000;
        // console.log(obj1);
        // console.log(obj2);
        
        // obj1 obj2互不隶属  是两个独立的对象 copy 复制

        // 浅拷贝：把对象的第一层属性或方法拷贝给一个新的对象，开发中我们经常需要复制一个对象如果直接赋值，则复制的是地址，修改任何一个对象，另一个对象都会变化
        // 1: 浅拷贝方法  Object.assign(obj2,obj1)
        let obj1={name:"jack",age:18,hobby:"swimming"}
        let obj2 = {};
        // Object.assign(obj2,obj1)
        // obj2.money = 2000
        // console.log(obj1);
        // console.log(obj2);
        
        //  2: 浅拷贝方法  展开运算符
        //  obj2 = { ...obj1};
        //  obj2.money = 2000;
        // console.log(obj1);
        // console.log(obj2);
        
        // 3： 循环obj1 在循环体赋值  封装成函数
        // for (const key in obj1) {
        //    obj2[key] = obj1[key]
            
        // }

        // console.log(obj1);
        // console.log(obj2);


        // 提高  封装成浅拷贝函数
        // var copy = function (obj1) {
        //     for (const key in obj1) {
        //         obj2[key] = obj1[key]
                
        //     }
        //     return obj2;
        // }

        // copy(obj1)
        // obj2.car = "奔驰"
        // console.log(obj1);
        // console.log(obj2);

        // 数组的浅拷贝
        let  arr1 = ["乔治","佩奇",["艾米莉"]]
        // 2.1： concat() 方法实现数组的浅拷贝

        // let arr2 = [].concat(arr1)
        // arr2[0] = "佩德罗"
        // console.log(arr1);
        // console.log(arr2);
        

        // 2.2  扩展运算符
        let  arr2 = [...arr1]
        arr2[2][0] = "mary"
        console.log(arr1);
        console.log(arr2);


        // 2.3： 循环arr 在循环体赋值  封装成函数


    </script>
</body>
</html>